// 用户认证状态管理
import { defineStore } from 'pinia'
import { userLogin, userRegister, userLogout, getUserInfo } from '../api/auth'

export const useAuthStore = defineStore('auth', {
  state: () => ({
    // 当前登录用户信息
    userInfo: null,
    // 登录状态
    isLoggedIn: false,
    // 认证token
    token: null,
    // 登录加载状态
    loginLoading: false,
    // 注册加载状态
    registerLoading: false
  }),

  getters: {
    // 是否已认证
    isAuthenticated: (state) => !!state.token && !!state.userInfo,

    // 用户名
    username: (state) => state.userInfo?.username || '',

    // 用户ID
    userId: (state) => state.userInfo?.id || null
  },

  actions: {
    /**
     * 初始化认证状态 - 从localStorage恢复登录状态
     */
    initAuth() {
      const token = localStorage.getItem('token')
      const userInfo = localStorage.getItem('userInfo')

      if (token && userInfo) {
        try {
          this.token = token
          this.userInfo = JSON.parse(userInfo)
          this.isLoggedIn = true
        } catch (error) {
          console.error('解析用户信息失败:', error)
          this.clearAuth()
        }
      }
    },

    /**
     * 用户登录
     * @param {Object} loginData - 登录数据
     * @returns {Promise} 登录结果
     */
    async login(loginData) {
      this.loginLoading = true

      try {
        const response = await userLogin(loginData)

        // 检查响应结构
        console.log('📥 登录API响应:', response)

        // 保存认证信息
        if (response.success && response.data && response.data.token) {
          this.token = response.data.token
          this.userInfo = {
            userId: response.data.userId,
            username: loginData.username,
            ...response.data
          }
          this.isLoggedIn = true

          // 持久化存储
          localStorage.setItem('token', this.token)
          localStorage.setItem('userInfo', JSON.stringify(this.userInfo))

          return { success: true, data: response }
        } else {
          // 如果没有token，可能是登录失败
          const errorMsg = response.message || response.msg || '登录失败，用户名或密码错误'
          throw new Error(errorMsg)
        }
      } catch (error) {
        console.error('登录失败:', error)
        // 如果是业务错误（来自request.js的reject），直接使用错误信息
        const errorMessage = error.message || '登录失败，请稍后重试'
        return { success: false, error: errorMessage }
      } finally {
        this.loginLoading = false
      }
    },

    /**
     * 用户注册
     * @param {Object} registerData - 注册数据
     * @returns {Promise} 注册结果
     */
    async register(registerData) {
      this.registerLoading = true

      try {
        const response = await userRegister(registerData)

        // 注册成功后可以选择自动登录
        if (response.success) {
          // 可以在这里自动登录
          // await this.login({
          //   username: registerData.username,
          //   password: registerData.password
          // })

          return { success: true, data: response }
        } else {
          throw new Error(response.message || '注册失败')
        }
      } catch (error) {
        console.error('注册失败:', error)
        return { success: false, error: error.message }
      } finally {
        this.registerLoading = false
      }
    },

    /**
     * 用户登出
     * @returns {Promise} 登出结果
     */
    async logout() {
      try {
        // 调用登出API
        await userLogout()
      } catch (error) {
        console.warn('登出API调用失败:', error)
      } finally {
        // 无论API是否成功，都清除本地状态
        this.clearAuth()
      }
    },

    /**
     * 清除认证状态
     */
    clearAuth() {
      this.userInfo = null
      this.isLoggedIn = false
      this.token = null

      // 清除本地存储
      localStorage.removeItem('token')
      localStorage.removeItem('userInfo')
    },

    /**
     * 获取用户信息
     * @returns {Promise} 用户信息
     */
    async fetchUserInfo() {
      try {
        const response = await getUserInfo()
        this.userInfo = response.data || response

        // 更新本地存储
        localStorage.setItem('userInfo', JSON.stringify(this.userInfo))

        return { success: true, data: this.userInfo }
      } catch (error) {
        console.error('获取用户信息失败:', error)

        // 如果是401错误，清除认证状态
        if (error.response?.status === 401) {
          this.clearAuth()
        }

        return { success: false, error: error.message }
      }
    },

    /**
     * 更新用户信息
     * @param {Object} userInfo - 新的用户信息
     */
    updateUserInfo(userInfo) {
      this.userInfo = { ...this.userInfo, ...userInfo }
      localStorage.setItem('userInfo', JSON.stringify(this.userInfo))
    }
  }
})